Os Dados

Nós temos dados de 39054 jogos oficiais de diferentes campeonatos ou amistosos propostos pela FIFA. Para a nossa análise iremos extrair apenas os jogos em que o Brasil participou.

jogos_brasil = games %>% 
    filter(home_team == "Brazil" | away_team == "Brazil") %>% 
    mutate(time1 = "Brazil", 
           time2 = if_else(home_team == "Brazil", away_team, home_team), 
           score1 = if_else(home_team == "Brazil", home_score, away_score),
           score2 = if_else(home_team == "Brazil", away_score, home_score) 
    )

Mais filtros…

Dentre os nossos dados temos o time que jogou contra o Brasil, o placar do jogo, o ano em que o jogo foi realizado, se foi campeonato (e qual foi) ou se foi amistoso.

Mas para a nossa análise, iremos observar apenas os dados do placar do jogo e o time que enfrentou o Brasil para que possamos verificar se existe algum padrão nos jogos com adversários do Brasil.

historicos = jogos_brasil %>% 
    group_by(time2) %>% 
    summarise(
        jogos = n(),
        ganhou = sum(score1 > score2) / n(), 
        empatou = sum(score1 == score2) / n(),
        perdeu = sum(score1 < score2) / n()
        )

Finalmente…

Agora sim temos os dados da forma que precisamos para a nossa análise.

Utilizamos o placar do jogo para inferir se o Brasil ganhou, perdeu ou empatou.

historicos %>% summary()
##     time2               jogos            ganhou          empatou      
##  Length:87          Min.   :  1.00   Min.   :0.0000   Min.   :0.0000  
##  Class :character   1st Qu.:  1.00   1st Qu.:0.6667   1st Qu.:0.0000  
##  Mode  :character   Median :  4.00   Median :0.8333   Median :0.0000  
##                     Mean   : 10.94   Mean   :0.8014   Mean   :0.1205  
##                     3rd Qu.: 12.00   3rd Qu.:1.0000   3rd Qu.:0.2265  
##                     Max.   :102.00   Max.   :1.0000   Max.   :0.5000  
##      perdeu       
##  Min.   :0.00000  
##  1st Qu.:0.00000  
##  Median :0.00000  
##  Mean   :0.07809  
##  3rd Qu.:0.13333  
##  Max.   :0.60000

A partir do sumário acima podemos tirar as seguintes conclusões:

time2   - O Brasil enfrentou 87 times diferentes.

jogos   - O Brasil possui de 1 a 102 jogos contra cada time.

ganhou  - O Brasil ganhou em média cerca de 80% dos jogos registrados.

empatou - O Brasil empatou em média cerca de 12% dos jogos registrados.

perdeu  - O Brasil perdeu em média cerca de 8% dos jogos registrados.

Motivação

Como nós temos os dados de jogos, vitórias, empates e derrotas, surge uma breve curiosidade de saber se os jogos que o Brasil teve podem ser classificados em grupos.

GAP Statistic

A GAP compara a solução do agrupamento com cada k com a solução em um dataset onde não há estrutura de grupos. Utilizaremos essa essa medida para descobrir uma quantidade ideal de grupos que podemos dividir para que tenhamos bons resultados.

plot_clusgap = function(clusgap, title="Gap Statistic calculation results"){
    require("ggplot2")
    gstab = data.frame(clusgap$Tab, k=1:nrow(clusgap$Tab))
    p = ggplot(gstab, aes(k, gap)) + geom_line() + geom_point(size=5)
    p = p + geom_errorbar(aes(ymax=gap+SE.sim, ymin=gap-SE.sim), width = .2)
    p = p + ggtitle(title)
    return(p)
}

log_historico <- historicos %>% 
                  mutate(jogos.qtd = log10(jogos))

gaps <- log_historico %>% 
    select(jogos.qtd, ganhou, perdeu, empatou) %>% 
    mutate_all(scale) %>% 
    clusGap(FUN = kmeans, 
            nstart = 100, 
            K.max = 8,
            B = 200,
            iter.max = 30)

plot_clusgap(gaps)

Como é possível ver acima, temos que quando o k passa de 1 para 2, temos que a estrutura com dois grupos apresenta um possível melhor resultado do que para um grupo apenas. Da mesma forma, quando passa de 6 para 7.

Particularmente, acredito que 2 seja um valor muito baixo para k, por outro lado, 7 é muito alto. Portanto, iremos utilizar k = 4 que apresenta uma solução boa e que não possui muita variação em relação aos valores que estão a sua volta.

K-Means

Para gerar os grupos ou clusters, iremos utilizar o algoritmo k-means com k = 4. Para realizar o agrupamento iremos utilizar a quantidade de jogos, e para cada jogo, se ganhou, perdeu ou empatou.

features <- c('jogos.qtd', 'ganhou', 'perdeu', 'empatou')
n_clusters <- 4
jogos_clusters <- kmeans(log_historico[, features], n_clusters, nstart = 100)

autoplot(jogos_clusters, data = log_historico, frame = TRUE)

A partir da execução do algoritmo recebemos a estrutura como pode ser vista acima. Mas não conseguimos extrair muitas informações dela, pois não sabemos onde cada grupo está localizado justamente por nossa análise ser com mais de duas dimensões.

E agora?

Para isso, iremos utilizar uma visualização individual para cada grupo ou cluster e iremos perceber quais características aqueles jogos possuem em comum para que fossem agrupados.

toclust <- log_historico %>% 
    select(-time2, -jogos) %>%
    rownames_to_column(var = "title")

n_clusters <- 4
km = toclust %>% 
    select(-title) %>%
    kmeans(centers = n_clusters, nstart = 100)

p <- km %>% 
    augment(toclust) %>%
    gather(key = "variável", value = "valor", -title, -.cluster) %>%
    ggplot(aes(x = `variável`, y = valor, group = title, colour = .cluster)) + 
    geom_point(alpha = 0.2) + 
    geom_line(alpha = .5) + 
    facet_wrap(~ .cluster)

ggplotly(p)

Para facilitar a interpretação, é necessário explicar como que é a distribuição dos dados, já que possuem escalas diferentes.

As variáveis empatou, ganhou e perdeu variam de 0 a 1, enquanto jogos.qtd varia de 0 a 2.

Com a visualizaçao acima podemos ver as características de cada grupo, que são:

Cluster 1: Jogos com poucos empates, poucas e muitas vitórias, com uma quantidade relativamente alta de jogos e é o grupo que possui mais derrotas.

Cluster 2: Jogos com poucos ou nenhum empate, muitas vitórias, muitos jogos e poucas derrotas.

Cluster 3: Nenhum empate, todas as vitórias, bem poucos jogos e nenhuma derrota.

Cluster 4: Poucos empates, muitas vitórias, uma quantidade mediana de jogos e com poucas derrotas.

Os Grupos

Peladeiro

Foi o nome dado ao Cluster 1 por ser um grupo que possui as características misturadas.

Fominha

Nome dado ao Cluster 2 devido a quantidade muito grande de partidas.

Sem Revanche

O Cluster 3 possui bem poucos jogos e em todos eles, o Brasil obteve vitória, por isso, recebeu esse nome.

É Penta

Por ser um grupo que ganha muito, perde pouco e tem uma quantidade mediana de jogos, esse foi o nome escolhido para o Cluster 4.